﻿using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Kikooland.Core;
using System;
using System.IO;

namespace Kikooland
{
    public class Projectile : Entity
    {
        public Entity Target { get; set; } // ne peut pas changer une fois le projectile partit.
        public bool AutoTargeting { get; set; } // détermine si le projectile suit le déplacement de la cible
        public double Speed { get; set; } // la vitesse de déplacement du projectile (en pixel / itération)
        public bool TargetReached { get; set; } // détermine si le projectile a atteint sa cible

        private double a;
        private double b;
        private double cosinusAlpha; //alpha : angle formé entre X et hypothénuse
        private double sinusAlpha; //alpha : angle formé entre X et hypothénuse
        
        public Projectile(bool autociblage = true, bool targetReached = false)
            : base()
        {
            this.AutoTargeting = autociblage;
            this.TargetReached = targetReached;
        }

        public void Update(GameTime gameTime)
        {
            // Calcul de la prochaine coordonnée du projectile
            if (AutoTargeting)
            {
                var targetRect = this.Target.Position;
                SetLinearMovementEquation(new Vector2(this.Position.X, this.Position.Y), new Vector2(targetRect.X, targetRect.Y));                               
                
                //using (var sW = new StreamWriter(@"C:\log.csv", true))
                //{
                //    sW.WriteLine(string.Format("{0};{1}", this.Position.X, this.Position.Y));
                //    sW.Close();
                //}

                this.Position.Translation(DonnerEmplacementProjectileSuivant(
                    new Vector2(this.Position.X, this.Position.Y),
                    this.Speed));
            }            
        }

        public override void Draw(GameTime gameTime, SpriteBatch spriteBatch)
        {
            base.Draw(gameTime, spriteBatch);
        }

        public void SetLinearMovementEquation(Vector2 init, Vector2 target)
        {
            // Calcul de la composante b
            b = (init.Y - (init.X * target.Y / target.X)) / (1 - (init.X / target.X));
 
            // Calcul de la composante a
            a = (init.Y - b) / init.X;

            // Calcul de l'hypothénuse
            var hyp = Math.Sqrt(Math.Pow(target.X - init.X, 2) + Math.Pow(target.Y - init.Y, 2));

            // Déduction du cosinus et sinus alpha
            cosinusAlpha = (target.X - init.X) / hyp;
            sinusAlpha = (target.Y - init.Y) / hyp;
        }

        /// </summary>
        private RectangleEx DonnerEmplacementProjectileSuivant(Vector2 init, double distance)
        {
            return new RectangleEx(
                (distance * cosinusAlpha),
                (distance * sinusAlpha),
                0, 0);
        }
    }
}
